<?php

namespace App\Http\Controllers\Admin;

use App\Events\AdminUserLogin;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\LoginRequest;
use App\Traits\ThrottlesLogins;
use App\Transformers\System\SystemAdminTransformer;
use Dflydev\DotAccessData\Data;
use Illuminate\Http\Request;

class LoginController extends Controller

{
    use ThrottlesLogins;

    /**
     * 后台管理员登录
     */
    function login(LoginRequest $request)
    {
        //进行判断登录的次数是否超过最大限制次数
        if (
            method_exists($this, 'hasTooManyLoginAttempts') && $this->hasTooManyLoginAttempts($request)
        ) {
            return $this->response->errorForbidden('已超过最大登录尝试次数, 请稍后再试');
        }
        //调用自定义的查询数据库的方法验证用户名密码是否正确 正确返回 true 错误返回 false
        $token = $this->attemptLogin($request);
        //判断验证后的账号和密码是否正确
        if (!$token) {
            // 不正确的时候在缓存中增加错误次数
            $this->incrementLoginAttempts($request);
            // 进行提示 登录失败
            return $this->response->errorForbidden('账号或密码错误');
        }
        //获取当前登录的用户的信息
        $user = $this->guard()->user();
        //判断当前登录用户的状态是否被禁用
        if ($user->status == 0) {
            return $this->response->errorForbidden('该用户被禁用');
        }
        //启用事件监听的功能将登录的用户信息添加到后台管理员登录日志表中
        AdminUserLogin::dispatch($user->id, $request->ip(), $request->header("user-agent"));
        //使用 auth门面 以及jwt 驱动获取到登录成功后的 token 值
        $token = $this->guard()->getToken()->get();
        //调用token的方法 返回token信息
        return $this->respondWithToken($token);
    }

    /**
     * 用户验证表单传来的账号和密码是否正确 正确的返回 true  错误的话返回 false
     */
    protected function attemptLogin(Request $request)
    {
        $account = $request->get('account');  //接受表单传来的账号和密码
        $password = $request->get('password');
        //返回使用 auth （auth中含有用户的数据库的模型） 认证接受的账号和密码是否正确
        return $this->guard()->attempt([
            'account' => $account,
            'password' => $password,
        ]);
    }

    /**
     * auth 使用门面 admin admin中包含 后台管理员的模型
     */
    public function guard()
    {
        //后台使用api的组
        return auth()->guard('admin');
    }

    /**
     * token 格式化返回
     */
    protected function respondWithToken($token)
    {
        return $this->response->array([
            'access_token' => $token,
            'token_type' => 'Bearer',
            'expires_in' => auth('admin')->factory()->getTTL() * 600000,
        ]);
    }

    /**
     * 刷新token
     */
    public function refresh()
    {
        //使用 refresh() 可以刷新当前登录用户的token值
        $token = $this->guard()->refresh();
        //将刷新后的token进行返回
        return $this->respondWithToken($token);
    }

    /**
     * 获取登录用户的信息
     */
    public function me()
    {
        //获取到当前登录用户的信息
        $user = $this->guard()->user();
        // 使用 transformer 进行格式化返回 当前登录用户的信息
        return $this->response->item($user, new SystemAdminTransformer());
    }

    /**
     * 退出登录
     */
    public function logout()
    {
        //使用 jwt的 invalidate() 可以使当前登录用户的token值过期
        $this->guard()->invalidate(true);
        //使用 jwt的 logout() 可以退出当前登录用户的token
        $this->guard()->logout();
        //退出后返回一个空的token
        return $this->respondWithToken('');
    }

}

